import vnode from './vnode'

export default function (sel, data, c) {
  // 检查参数个数
  if (arguments.length !== 3) throw new Error('参数必须为3个')

  // 检查参数c类型
  if (typeof c === 'string' || typeof c === 'number') {
    return vnode(sel, data, undefined, c, undefined)
  } else if (Array.isArray(c)) {
    let children = []
    // 遍历c，收集children
    for (let i = 0; i < c.length; i++) {
      // 检查c[i]必须是一个对象，如果不满足
      if (!(typeof c[i] === 'object' && c[i].hasOwnProperty('sel')))
        throw new Error('传入的数组参数中有项不是h函数')

      // 这里不用执行c[i]，因为在使用h函数的时候已经有了执行
      // 此时只需要收集就好
      children.push(c[i])
    }

    // 循环结束了，就说明children收集完毕了，此时可以返回虚拟节点了，它有children属性的
    return vnode(sel, data, children, undefined, undefined)
  } else if (typeof c === 'object' && c.hasOwnProperty('sel')) {
    // 传入的c是唯一的chldren，不用执行c
    let children = [c]
    return vnode(self, data, children, undefined, undefined)
  } else {
    throw new Error('传入的第三个参数类型不对')
  }
}
